﻿/**	@file		lxio_async.h
 *	@date		(2010-09-02 21:38:44)/(2013-03-25 23:36:54)
 *-----------------------------------------------------------------------------
 *	\brief		IOCP 头文件.
 *	@version	1.1.2.3
 *	@author		Nick Shallery	(nicknide@gmail.com)
 *	@copyright	YOU HAVE ALL LEFT WITH THIS CODE WHILE YOU KEEP COMMENT IN EVERY COPY.
 *-----------------------------------------------------------------------------
**/

#if			!defined(__LOLIX__LXIO__LXIO_ASYNC_POOL__H__NICK__K_IN_G__)
#define		__LOLIX__LXIO__LXIO_ASYNC_POOL__H__NICK__K_IN_G__
//==============================================================================
//--------------------------------------------------------------------------

#if			!defined(__LOLIX__LOLI__SIGNAL__H__K_IN_G__)
	#include	"../lolix/loli/signal.h"
#endif	//	!defined(__LOLIX__LOLI__SIGNAL__H__K_IN_G__)

#if			!defined(__LOLIX__LOLI__FILE__H__K_IN_G__)
	#include	"../lolix/loli/file.h"
#endif	//	!defined(__LOLIX__LOLI__FILE__H__K_IN_G__)

//#if			!defined(__LOLIX__TOY_ALLOCATOR__K_IN_G__)
//	#include	"../lolix/toy/allocator.h"
//#endif	//	!defined(__LOLIX__TOY_ALLOCATOR__K_IN_G__)


namespace lxio{

class LOLIX_NO_VTABLE async_result_filter
	: public lolix::loli::file_async::async_result
{
public:
	LOLIX_DECLARE_ITF(lxio::async_result_filter, lolix::loli::file_async::async_result, (0x993e9aff, 0x0b8c264d, 0xb858742f, 0xfb8a733b));
	//===========================================================================
	//	在经过异步前的一次回调
	//---------------------------------------------------------------------------
	//	@buf		[ o] :	当前使用的缓冲区
	//	@buf_len	[ o] :	当前缓冲区长度
	//	@start_pos	[i ] :	文件访问的起始长度
	//	@sys_ptr	[i ] :	不同系统使用的异步辅助对象
	//---------------------------------------------------------------------------
	//	#	buf 返回为空， 则表示自己内部已经调用过系统相关 API 而无需外部继续调用
	//		标准IO操作接口
	//	#	sys_ptr : MS-WINDOWS 平台, 为 OVERLAPPED* 数据
	//===========================================================================
	LOLIX_INTERFACE(before_query, lolix::LOLIX_RETNV	, (void** buf, lolix::size_type* buf_len, lolix::lx_u64 start_pos, void* sys_ptr));

	//===========================================================================
	//	异步调用返回接口
	//---------------------------------------------------------------------------
	//	@dat_size	[i ] :	读取到的数据长度
	//	@--usr_dat	[i ] :	用户在 file_async_pool push_handle 中的 usr_dat
	//			-- 不能在确保效率的各种情况下都能够取得此数据,因此去掉此参数
	//	@rtv		[i ] :	异步调用返回结果
	//===========================================================================
	LOLIX_INTERFACE(set_result	, void					, (lolix::size_type dat_size/*, void* usr_dat*/, lolix::LOLIX_RETNV rtv));
};


class LOLIX_NO_VTABLE file_async_pool
	: public lolix::itf
{
public:
	LOLIX_DECLARE_ITF(lxio::file_async_pool, lolix::itf, (0x84aaaba2, 0x70862d42, 0xae3ba54f, 0x11fbfbd0));
	/**
	 *	\fn lolix::LOLIX_RETNV file_async_pool::push_handle(void* fl_h);
	 *	\brief 将句柄放入异步池中
	 *
	 *	\param fl_h		系统文件句柄.
	 *
	 *	\param --usr_dat	async_result_filter 中 set_result 可以获得的 usr_dat
	 *			-- 不能在确保效率的各种情况下都能够取得此数据,因此去掉此参数.
	 *
	 *	\remark	fl_h : MS-WINDOWS 中为文件句柄 HANDLE, 和网络句柄 SOCKET 等.
	**/
	LOLIX_INTERFACE(push_handle	, lolix::LOLIX_RETNV	, (void* fl_h/*, void* usr_dat*/));

	//===========================================================================
	//	将句柄从异步池中弹出
	//---------------------------------------------------------------------------
	//	@fl_h		[i ] :	系统文件句柄
	//---------------------------------------------------------------------------
	//	#	fl_h : MS-WINDOWS 中为文件句柄 HANDLE, 和网络句柄 SOCKET 等
	//	MS-WINDOWS 不支持该操作 : 完成端口模型无此操作
	//===========================================================================
	LOLIX_INTERFACE(pop_handle	, lolix::LOLIX_RETNV	, (void* fl_h));
	LOLIX_INTERFACE(read_query	, lolix::LOLIX_RETNV	, (void* fl_h, lolix::lx_u64 file_start_pos, async_result_filter* ptr));
	LOLIX_INTERFACE(write_query	, lolix::LOLIX_RETNV	, (void* fl_h, lolix::lx_u64 file_start_pos, async_result_filter* ptr));

	//===========================================================================
	//	关闭异步池
	//---------------------------------------------------------------------------
	//===========================================================================
	LOLIX_INTERFACE(close		, lolix::LOLIX_RETNV	, (void));
};


class LOLIX_NO_VTABLE file_async_pool_factory
	: public lolix::itf
{
public:
	LOLIX_DECLARE_ITF(lxio::file_async_pool_factory, lolix::itf, (0xfcb4b7ec, 0xc91543e4, 0xbc2a2af1, 0xaa925bd7));
	LOLIX_INTERFACE(create_inst, lolix::LOLIX_RETNV, (file_async_pool** out_ptr, size_type max_work_thread_count));
};

}


//--------------------------------------------------------------------------
//==============================================================================
#endif	//	!defined(__LOLIX__LXIO__LXIO_ASYNC_POOL__H__NICK__K_IN_G__)
